﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace BullshitArticalGenerator
{
    public partial class MainForm : Form
    {
        private ShitResources shitResources = new ShitResources();
        private ShitResourcesEnglish shitResourcesEnglish = new ShitResourcesEnglish();

        public bool IsGeneratingArticle
        {
            get;
            set;
        } = true;

        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            cbCPU.SelectedIndex = 1;
        }

        private delegate string MethodCaller();

        private string GenerateSimplifiedChineseParagraph()
        {
            Random random = new Random();
            string tmp = "      ";

            while (true)
            {
                if (random.Next(0, 3) == 0)
                {
                    tmp += shitResources.GetShitSaying().Replace("曾经说过", shitResources.GetShitBeforeSayingWords()) 
                        + shitResources.GetShitAfterSayingWords() + shitResources.GetShitBeginWords() 
                        + shitResources.GetShitText();
                }
                else if (random.Next(0, 3) == 0)
                {
                    tmp += shitResources.GetShitBeginWords() + shitResources.GetShitText();
                }
                else if (random.Next(0, 3) == 0)
                {
                    tmp += shitResources.GetShitQuestion() + shitResources.GetShitText();
                }
                else
                {
                    tmp += shitResources.GetShitText();
                }

                if (tmp.Length > random.Next(200, 500))
                {
                    tmp = tmp.Replace("x", tbSubject.Text);
                    return tmp + Environment.NewLine;
                }
            }
        }

        private string GenerateEnglishParagraph()
        {
            Random random = new Random();
            string tmp = "";

            while (true)
            {
                if (random.Next(0, 3) == 0)
                {
                    tmp += shitResourcesEnglish.GetShitSaying().Replace("once said", shitResourcesEnglish.GetShitBeforeSayingWords())
                        + shitResourcesEnglish.GetShitAfterSayingWords() + shitResourcesEnglish.GetShitBeginWords()
                        + shitResourcesEnglish.GetShitText();
                }
                else if (random.Next(0, 3) == 0)
                {
                    tmp += shitResourcesEnglish.GetShitBeginWords() + shitResourcesEnglish.GetShitText();
                }
                else if (random.Next(0, 3) == 0)
                {
                    tmp += shitResourcesEnglish.GetShitQuestion() + shitResourcesEnglish.GetShitText();
                }
                else
                {
                    tmp += shitResourcesEnglish.GetShitText();
                }

                if (tmp.Length > random.Next(400, 800))
                {
                    tmp = tmp.Replace("替换", tbSubject.Text);
                    return tmp + Environment.NewLine; ;
                }
            }
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            if (tbSubject.Text == "")
            {
                MessageBox.Show("请输入主题！", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            else
            {
                try
                {
                    if (tbTextLenth.Text == "")
                    {
                        tbTextLenth.Text = "6000";
                    }
                    else if (int.Parse(tbTextLenth.Text) <= 0)
                    {
                        MessageBox.Show("请输入正整数！", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
                }
                catch
                {
                    MessageBox.Show("请输入数字！", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
            }

            this.Visible = false;
            IsGeneratingArticle = true;

            GenerateArticle();
        }

        private void GenerateArticle()
        {
            string tmpAll = "";

            CShowInformation f = new CShowInformation();
            f.ParentForm = this;
            f.GoalTextLength = int.Parse(tbTextLenth.Text);
            f.TopMost = true;
            f.Show();

            if (rbSimplifiedChinese.Checked)
            {
                tmpAll = "      " + shitResources.GetShitText() + shitResources.GetShitQuestion() + shitResources.GetShitSaying().Replace("曾经说过", shitResources.GetShitBeforeSayingWords())
                        + shitResources.GetShitAfterSayingWords() + shitResources.GetShitBeginWords()
                        + shitResources.GetShitText() + Environment.NewLine;

                while (true)
                {
                    if (!IsGeneratingArticle)
                    {
                        return;
                    }

                    if (tmpAll.Length >= int.Parse(tbTextLenth.Text))
                    {
                        break;
                    }

                    MethodCaller caller = new MethodCaller(GenerateSimplifiedChineseParagraph);
                    switch (cbCPU.SelectedIndex)
                    {
                        case 0:
                            if (tmpAll.Length + 10000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke();
                            }
                            else if (tmpAll.Length + 5000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke();
                            }
                            else if (tmpAll.Length + 2500 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke(); ;
                            }
                            else if (tmpAll.Length + 1000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke();
                            }
                            else
                            {
                                tmpAll += caller.Invoke();
                            }
                            break;

                        case 1:
                            if (tmpAll.Length + 5000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke();
                            }
                            else if (tmpAll.Length + 2500 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke(); ;
                            }
                            else if (tmpAll.Length + 1000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke();
                            }
                            else
                            {
                                tmpAll += caller.Invoke();
                            }
                            break;

                        case 2:
                            if (tmpAll.Length + 2500 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke(); ;
                            }
                            else if (tmpAll.Length + 1000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke();
                            }
                            else
                            {
                                tmpAll += caller.Invoke();
                            }
                            break;

                        case 3:
                            tmpAll += caller.Invoke();
                            break;
                        default:
                            if (tmpAll.Length + 2500 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke(); ;
                            }
                            else if (tmpAll.Length + 1000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke();
                            }
                            else
                            {
                                tmpAll += caller.Invoke();
                            }
                            break;
                    }

                    tmpAll = tmpAll.Replace("x", tbSubject.Text);
                    f.ShowedText = tmpAll;
                    Application.DoEvents();
                }

                tmpAll = (tmpAll + "      综上所述，因此我认为，x是十分有必要的。").Replace("x", tbSubject.Text);
            }
            else if (rbEnglish.Checked)
            {
                tmpAll = "      " + shitResourcesEnglish.GetShitText() + shitResourcesEnglish.GetShitQuestion() + shitResourcesEnglish.GetShitSaying().Replace("once said", shitResourcesEnglish.GetShitBeforeSayingWords())
                        + shitResourcesEnglish.GetShitAfterSayingWords() + shitResourcesEnglish.GetShitBeginWords()
                        + shitResourcesEnglish.GetShitText() + Environment.NewLine;

                while (true)
                {
                    if (!IsGeneratingArticle)
                    {
                        return;
                    }

                    if (tmpAll.Length >= int.Parse(tbTextLenth.Text))
                    {
                        break;
                    }

                    MethodCaller caller = new MethodCaller(GenerateEnglishParagraph);
                    switch (cbCPU.SelectedIndex)
                    {
                        case 0:
                            if (tmpAll.Length + 16000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke();
                            }
                            else if (tmpAll.Length + 8000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke();
                            }
                            else if (tmpAll.Length + 4000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke(); ;
                            }
                            else if (tmpAll.Length + 1600 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke();
                            }
                            else
                            {
                                tmpAll += caller.Invoke();
                            }
                            break;

                        case 1:
                            if (tmpAll.Length + 8000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke();
                            }
                            else if (tmpAll.Length + 4000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke(); ;
                            }
                            else if (tmpAll.Length + 1600 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke();
                            }
                            else
                            {
                                tmpAll += caller.Invoke();
                            }
                            break;

                        case 2:
                            if (tmpAll.Length + 4000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke(); ;
                            }
                            else if (tmpAll.Length + 1600 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke();
                            }
                            else
                            {
                                tmpAll += caller.Invoke();
                            }
                            break;

                        case 3:
                            tmpAll += caller.Invoke();
                            break;
                        default:
                            if (tmpAll.Length + 4000 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke() + caller.Invoke(); ;
                            }
                            else if (tmpAll.Length + 1600 <= int.Parse(tbTextLenth.Text))
                            {
                                tmpAll += caller.Invoke() + caller.Invoke();
                            }
                            else
                            {
                                tmpAll += caller.Invoke();
                            }
                            break;
                    }

                    tmpAll = tmpAll.Replace("替换", tbSubject.Text);
                    f.ShowedText = tmpAll;
                    Application.DoEvents();
                }

                tmpAll = (tmpAll + "As a result, I believe that As a result, I believe that 替换 is very important and necessary.").Replace("替换", tbSubject.Text);
            }
            else
            {
                MessageBox.Show("请选择生成语言！", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            f.ShowedText = tmpAll;
            f.ReturnToStart();
        }
    }
}
